package com.atguigu.jxc.dao;

import com.atguigu.jxc.entity.Goods;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author 杨林
 * @create 2023-01-28 10:24 星期六
 * description:
 */
public interface GoodsDao {


    List<Goods> getGoodsInventoryList(@Param("offSet") int offSet,
                                      @Param("rows") Integer rows,
                                      @Param("codeOrName") String codeOrName,
                                      @Param("goodsTypeId") Integer goodsTypeId);

    /**
     * 获取查询总记录数
     * @param codeOrName
     * @param goodsTypeId
     * @return
     */
    Integer getGoodsInventoryCount(@Param("codeOrName") String codeOrName,
                                   @Param("goodsTypeId") Integer goodsTypeId);


    /**
     *
     * @param offSet
     * @param rows
     * @param goodsName
     * @param goodsTypeId
     * @return
     */
    List<Goods> getGoodsList(@Param("offSet") int offSet,
                             @Param("rows") Integer rows,
                             @Param("goodsName") String goodsName,
                             @Param("goodsTypeId") Integer goodsTypeId);

    /**
     *
     * @param goodsName
     * @param goodsTypeId
     * @return
     */
    Integer getGoodsTotal(String goodsName, Integer goodsTypeId);

    /**
     * 商品修改
     * @param goods
     */
    void update(Goods goods);

    /**
     * 商品添加
     * @param goods
     */
    void insert(Goods goods);

    /**
     * 获取当前商品中最大的编码
     * @return
     */
    String getMaxCode();

    /**
     * 根据id删除商品
     * @param goodsId
     */
    void delete(Integer goodsId);

    /**
     * 根据商品id获取商品的状态
     * @param goodsId
     * @return
     */
    Integer getGoodsState(Integer goodsId);

    /**
     * 展示无库存商品列表
     * @param offSet
     * @param rows
     * @param nameOrCode
     * @return
     */
    List<Goods> getNoInventoryQuantity(@Param("offSet") int offSet,
                                       @Param("rows") Integer rows,
                                       @Param("nameOrCode") String nameOrCode);

    /**
     * 获取无库存商品数量
     * @param nameOrCode
     * @return
     */
    Integer getNoInventoryQuantityCount(@Param("nameOrCode") String nameOrCode);

    /**
     * 有库存商品列表展示
     * @param offSet
     * @param rows
     * @param nameOrCode
     * @return
     */
    List<Goods> getHasInventoryQuantity(@Param("offSet") int offSet,
                                        @Param("rows") Integer rows,
                                        @Param("nameOrCode") String nameOrCode);

    /**
     * 获取有库存商品数量
     * @param nameOrCode
     * @return
     */
    Integer getHasInventoryQuantityCount(@Param("nameOrCode") String nameOrCode);

    /**
     * 添加库存、修改数量或成本价 (根据goodsId)
     * @param goodsId
     * @param inventoryQuantity
     * @param purchasingPrice
     */
    void saveStock(@Param("goodsId") Integer goodsId,
                   @Param("inventoryQuantity") Integer inventoryQuantity,
                   @Param("purchasingPrice") double purchasingPrice);

    /**
     * 删除库存  将库存置为0
     * @param goodsId
     */
    void deleteStock(@Param("goodsId") Integer goodsId);

    /**
     * 查询所有 当前库存量 小于 库存下限的商品信息
     * @return
     */
    List<Goods> listAlarm();


    /**
     * 修改商品数量为指定的值
     * @param goodsCode
     * @param num
     */
    void changeInventoryQuantity(@Param("goodsCode") String goodsCode,
                                 @Param("num") Integer num);

    /**
     * 获取当前商品的库存数量
     * @param goodsCode
     * @return
     */
    Integer getInventoryQuantity(@Param("goodsCode") String goodsCode);
}
